#include <iostream>
void Fun(int& x){std::cout << "左值引用" << std::endl;}
void Fun(const int& x){std::cout << "const 左值引用" << std::endl;}
void Fun(int&& x){std::cout << "右值引用" << std::endl;}
void Fun(const int&& x){std::cout << "const 右值引用" << std::endl;}

template <typename T>
void Function(T&& t)
{
    //Fun(t);//全部调用的都是左值
    //Fun(std::move(t));//全部调用的都是右值
    Fun(std::forward<T>(t));//完美转发通过底层强制类型转换解决问题
}

int main()
{
    //t被推导成了int&& ,T为int
    Function(10);

    int a;
    //t被推导成了int& ,T为int&
    Function(a);

    //t被推到成了int&& ,T为int
    Function(std::move(a));

     const int b = 8;
    //t被推导成了const int& ,T为const int&
    Function(b);

    //t被推到成了const int&& ,T为const int
    Function(std::move(b));
    return 0;
}